﻿#region Copyright

// // The contents of this file are subject to the Mozilla Public License
// // Version 1.1 (the "License"); you may not use this file except in compliance
// // with the License. You may obtain a copy of the License at
// //   
// // http://www.mozilla.org/MPL/
// //   
// // Software distributed under the License is distributed on an "AS IS"
// // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// // License for the specific language governing rights and limitations under 
// // the License.
// //   
// // The Initial Developer of the Original Code is Robert Smyth.
// // Portions created by Robert Smyth are Copyright (C) 2008-2013.
// //   
// // All Rights Reserved.

#endregion

using NoeticTools.NWorkflow.ProgressMonitoring;


namespace NoeticTools.NWorkflow
{
    public class ActivityListenerSpy<T> : IActivity<T>, IActivityListener<T>
    {
        private readonly IActivity<T> _inner;
        private readonly IActivityListener<T> _spyListener;
        private IActivityListener<T> _listener;

        public ActivityListenerSpy(IActivity<T> inner, IActivityListener<T> spyListener)
        {
            _inner = inner;
            _spyListener = spyListener;
        }

        public T End()
        {
            return _inner.End();
        }

        public object SyncRoot
        {
            get { return _inner.SyncRoot; }
        }

        public void Begin(IActivityListener<T> listener)
        {
            _listener = listener;
            _inner.Begin(this);
        }

        public void Cancel()
        {
            _inner.Cancel();
        }

        public void OnEvent(object value)
        {
            _inner.OnEvent(value);
        }

        public void OnProgress(IActivityProgress progress)
        {
            _spyListener.OnProgress(progress);
            _listener.OnProgress(progress);
        }

        void IStepProgressListener.OnProgress(string stepName, IProgress progress)
        {
            _spyListener.OnProgress(stepName, progress);
            _listener.OnProgress(stepName, progress);
        }

        void IActivityListener<T>.OnCompleted(IActivity<T> activity)
        {
            _spyListener.OnCompleted(activity);
            _listener.OnCompleted(activity);
        }
    }
}